package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.ComprobantePercepcionDescuentoDAO;
import mx.ipn.persistencia.dao.EmpleadoDAO;
import mx.ipn.to.ComprobantePercepcionDescuentoTO;
import mx.ipn.to.EmpleadoTO;
import mx.ipn.to.FechaHoraTO;

public class ComprobantePercepcionDescuentoDAOMySQL implements
		ComprobantePercepcionDescuentoDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(ComprobantePercepcionDescuentoDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO comprobante_percepcion_descuento (inicio_periodo,fecha_pago,sueldo_base,id_empleado) VALUES(?,?,?,?)";
	private static final String UPDATE = "UPDATE comprobante_percepcion_descuento SET inicio_periodo=?,fecha_pago=?,sueldo_base=?,id_empleado=? WHERE id_comprobante=?";

	private static final String FINDBYID = "SELECT * FROM comprobante_percepcion_descuento WHERE id_comprobante=?";

	private static final String SELECT = "SELECT * FROM comprobante_percepcion_descuento";
	private static final String SELECTBYRANGOFECHAPERIODO = "SELECT * FROM comprobante_percepcion_descuento WHERE inicio_periodo>=? AND inicio_periodo<=?";
	private static final String SELECTBYRANGOFECHAPAGO = "SELECT * FROM comprobante_percepcion_descuento WHERE fecha_pago>=? AND fecha_pago<=?";
	private static final String SELECTBYRANGOSUELDOBASE = "SELECT * FROM comprobante_percepcion_descuento WHERE sueldo_base>=? AND sueldo_base<=?";

	private static final String SELECTBYEMPLEADORANGOFECHAPERIODOFECHAPAGO = "SELECT * FROM comprobante_percepcion_descuento WHERE "
			+ "id_empleado=? AND inicio_periodo>=? AND inicio_periodo<=? AND fecha_pago>=? AND fecha_pago<=?";

	@Override
	public ComprobantePercepcionDescuentoTO findComprobantePercepcionDescuentoById(
			int idComprobante) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idComprobante);

			ResultSet rs = ps.executeQuery();
			FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			EmpleadoDAO empleadoDAO = fabricaMySQL.getEmpleadoDAO();

			if (rs.next()) {
				idComprobante = rs.getInt("id_comprobante");
				java.sql.Date inicioPeriodo = rs.getDate("inicio_periodo");
				java.sql.Date fechaPago = rs.getDate("fecha_pago");
				double sueldoBase = rs.getDouble("sueldo_base");

				ArrayList<EmpleadoTO> listEmpleadoTO = new ArrayList<EmpleadoTO>();
				EmpleadoTO empleadoTO = empleadoDAO.findEmpleadoById(rs
						.getInt("id_empleado"));

				listEmpleadoTO.add(empleadoTO);

				EmpleadoTO[] arrEmpleadoTO = (EmpleadoTO[]) listEmpleadoTO
						.toArray(new EmpleadoTO[listEmpleadoTO.size()]);

				ComprobantePercepcionDescuentoTO comprobantePercepcionDescuentoTO = new ComprobantePercepcionDescuentoTO(
						idComprobante, inicioPeriodo, fechaPago, sueldoBase,
						arrEmpleadoTO);
				ps.close();
				conexion.close();
				return comprobantePercepcionDescuentoTO;
			}
			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertComprobantePercepcionDescuento(
			ComprobantePercepcionDescuentoTO comprobantePercepcionDescuentoTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setDate(1, FechaHoraTO.getFecha(comprobantePercepcionDescuentoTO.getInicioPeriodo()));
			ps.setDate(2, FechaHoraTO.getFecha(comprobantePercepcionDescuentoTO.getFechaPago()));
			ps.setDouble(3, comprobantePercepcionDescuentoTO.getSueldoBase());
			ps.setInt(4, comprobantePercepcionDescuentoTO.getIdEmpleado());

			ps.executeUpdate();
			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ComprobantePercepcionDescuentoTO selectByEmpleadoRangoFechaPeriodoFechaPago(
			int idEmpleado, java.sql.Date inicioPeriodo,
			java.sql.Date finPeriodo, java.sql.Date inicioPago,
			java.sql.Date finPago) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			EmpleadoDAO empleadoDAO = null;

			ArrayList<Integer> listIdComprobante = null;
			ArrayList<java.sql.Date> listInicioPeriodo = null;
			ArrayList<java.sql.Date> listFechaPago = null;
			ArrayList<Double> listSueldoBase = null;
			ArrayList<EmpleadoTO> listEmpleadoTO = null;

			ComprobantePercepcionDescuentoTO comprobantePercepcionDescuentoTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYEMPLEADORANGOFECHAPERIODOFECHAPAGO);
			ps.setInt(1, idEmpleado);
			ps.setDate(2, inicioPeriodo);
			ps.setDate(3, finPeriodo);
			ps.setDate(4, inicioPago);
			ps.setDate(5, finPago);
			
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdComprobante == null) {

					listIdComprobante = new ArrayList<Integer>();
					listInicioPeriodo = new ArrayList<java.sql.Date>();
					listFechaPago = new ArrayList<java.sql.Date>();
					listSueldoBase = new ArrayList<Double>();
					listEmpleadoTO = new ArrayList<EmpleadoTO>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					empleadoDAO = fabricaMySQL.getEmpleadoDAO();
				}
				listIdComprobante.add(rs.getInt("id_comprobante"));
				listInicioPeriodo.add(rs.getDate("inicio_periodo"));
				listFechaPago.add(rs.getDate("fecha_pago"));
				listSueldoBase.add(rs.getDouble("sueldo_base"));
			}
			if (listIdComprobante != null) {
				listEmpleadoTO.add(empleadoDAO.findEmpleadoById(idEmpleado));

				EmpleadoTO[] arrEmpleadoTO = (EmpleadoTO[]) listEmpleadoTO
						.toArray(new EmpleadoTO[listEmpleadoTO.size()]);
				Integer[] arrIdComprobante = (Integer[]) listIdComprobante
						.toArray(new Integer[listIdComprobante.size()]);
				Date[] arrInicioPeriodo = (Date[]) listInicioPeriodo
						.toArray(new Date[listInicioPeriodo.size()]);
				Date[] arrFechaPago = (Date[]) listFechaPago
						.toArray(new Date[listFechaPago.size()]);
				Double[] arrSueldoBase = (Double[]) listSueldoBase
						.toArray(new Double[listSueldoBase.size()]);

				comprobantePercepcionDescuentoTO = new ComprobantePercepcionDescuentoTO(
						arrIdComprobante, arrInicioPeriodo, arrFechaPago,
						arrSueldoBase, arrEmpleadoTO);
			}
			ps.close();
			conexion.close();
			return comprobantePercepcionDescuentoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<ComprobantePercepcionDescuentoTO> selectByRangoFechaPago(
			Date inicio, Date fin) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYRANGOFECHAPAGO);
			ps.setDate(1, inicio);
			ps.setDate(2, fin);

			ResultSet rs = ps.executeQuery();
			FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			EmpleadoDAO empleadoDAO = fabricaMySQL.getEmpleadoDAO();

			ArrayList<ComprobantePercepcionDescuentoTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<ComprobantePercepcionDescuentoTO>();

				int idComprobante = rs.getInt("id_comprobante");
				java.sql.Date inicioPeriodo = rs.getDate("inicio_periodo");
				java.sql.Date fechaPago = rs.getDate("fecha_pago");
				double sueldoBase = rs.getDouble("sueldo_base");

				ArrayList<EmpleadoTO> listEmpleadoTO = new ArrayList<EmpleadoTO>();
				EmpleadoTO empleadoTO = empleadoDAO.findEmpleadoById(rs
						.getInt("id_empleado"));

				listEmpleadoTO.add(empleadoTO);

				EmpleadoTO[] arrEmpleadoTO = (EmpleadoTO[]) listEmpleadoTO
						.toArray(new EmpleadoTO[listEmpleadoTO.size()]);

				ComprobantePercepcionDescuentoTO comprobantePercepcionDescuentoTO = new ComprobantePercepcionDescuentoTO(
						idComprobante, inicioPeriodo, fechaPago, sueldoBase,
						arrEmpleadoTO);

				coleccion.add(comprobantePercepcionDescuentoTO);
			}
			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<ComprobantePercepcionDescuentoTO> selectByRangoFechaPeriodo(
			Date inicio, Date fin) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYRANGOFECHAPERIODO);
			ps.setDate(1, inicio);
			ps.setDate(2, fin);

			ResultSet rs = ps.executeQuery();
			FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			EmpleadoDAO empleadoDAO = fabricaMySQL.getEmpleadoDAO();

			ArrayList<ComprobantePercepcionDescuentoTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<ComprobantePercepcionDescuentoTO>();

				int idComprobante = rs.getInt("id_comprobante");
				java.sql.Date inicioPeriodo = rs.getDate("inicio_periodo");
				java.sql.Date fechaPago = rs.getDate("fecha_pago");
				double sueldoBase = rs.getDouble("sueldo_base");

				ArrayList<EmpleadoTO> listEmpleadoTO = new ArrayList<EmpleadoTO>();
				EmpleadoTO empleadoTO = empleadoDAO.findEmpleadoById(rs
						.getInt("id_empleado"));

				listEmpleadoTO.add(empleadoTO);

				EmpleadoTO[] arrEmpleadoTO = (EmpleadoTO[]) listEmpleadoTO
						.toArray(new EmpleadoTO[listEmpleadoTO.size()]);

				ComprobantePercepcionDescuentoTO comprobantePercepcionDescuentoTO = new ComprobantePercepcionDescuentoTO(
						idComprobante, inicioPeriodo, fechaPago, sueldoBase,
						arrEmpleadoTO);

				coleccion.add(comprobantePercepcionDescuentoTO);
			}
			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<ComprobantePercepcionDescuentoTO> selectByRangoSueldoBase(
			double inicio, double fin) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYRANGOSUELDOBASE);
			ps.setDouble(1, inicio);
			ps.setDouble(2, fin);

			ResultSet rs = ps.executeQuery();
			FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			EmpleadoDAO empleadoDAO = fabricaMySQL.getEmpleadoDAO();

			ArrayList<ComprobantePercepcionDescuentoTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<ComprobantePercepcionDescuentoTO>();

				int idComprobante = rs.getInt("id_comprobante");
				java.sql.Date inicioPeriodo = rs.getDate("inicio_periodo");
				java.sql.Date fechaPago = rs.getDate("fecha_pago");
				double sueldoBase = rs.getDouble("sueldo_base");

				ArrayList<EmpleadoTO> listEmpleadoTO = new ArrayList<EmpleadoTO>();
				EmpleadoTO empleadoTO = empleadoDAO.findEmpleadoById(rs
						.getInt("id_empleado"));

				listEmpleadoTO.add(empleadoTO);

				EmpleadoTO[] arrEmpleadoTO = (EmpleadoTO[]) listEmpleadoTO
						.toArray(new EmpleadoTO[listEmpleadoTO.size()]);

				ComprobantePercepcionDescuentoTO comprobantePercepcionDescuentoTO = new ComprobantePercepcionDescuentoTO(
						idComprobante, inicioPeriodo, fechaPago, sueldoBase,
						arrEmpleadoTO);

				coleccion.add(comprobantePercepcionDescuentoTO);
			}
			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<ComprobantePercepcionDescuentoTO> selectComprobantePercepcionDescuento() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();
			FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			EmpleadoDAO empleadoDAO = fabricaMySQL.getEmpleadoDAO();

			ArrayList<ComprobantePercepcionDescuentoTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<ComprobantePercepcionDescuentoTO>();

				int idComprobante = rs.getInt("id_comprobante");
				java.sql.Date inicioPeriodo = rs.getDate("inicio_periodo");
				java.sql.Date fechaPago = rs.getDate("fecha_pago");
				double sueldoBase = rs.getDouble("sueldo_base");

				ArrayList<EmpleadoTO> listEmpleadoTO = new ArrayList<EmpleadoTO>();
				EmpleadoTO empleadoTO = empleadoDAO.findEmpleadoById(rs
						.getInt("id_empleado"));

				listEmpleadoTO.add(empleadoTO);

				EmpleadoTO[] arrEmpleadoTO = (EmpleadoTO[]) listEmpleadoTO
						.toArray(new EmpleadoTO[listEmpleadoTO.size()]);

				ComprobantePercepcionDescuentoTO comprobantePercepcionDescuentoTO = new ComprobantePercepcionDescuentoTO(
						idComprobante, inicioPeriodo, fechaPago, sueldoBase,
						arrEmpleadoTO);

				coleccion.add(comprobantePercepcionDescuentoTO);
			}
			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short updateComprobantePercepcionDescuento(
			ComprobantePercepcionDescuentoTO comprobantePercepcionDescuentoTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps.setDate(1, FechaHoraTO.getFecha(comprobantePercepcionDescuentoTO.getInicioPeriodo()));
			ps.setDate(2, FechaHoraTO.getFecha(comprobantePercepcionDescuentoTO.getFechaPago()));
			ps.setDouble(3, comprobantePercepcionDescuentoTO.getSueldoBase());
			ps.setInt(4, comprobantePercepcionDescuentoTO.getIdEmpleado());
			ps.setInt(5, comprobantePercepcionDescuentoTO.getIdComprobante());

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

}
